package com.studentstreet;

import java.lang.reflect.Type;
import java.util.ArrayList;
import java.util.List;

import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.Window;
import android.widget.AbsListView;
import android.widget.AbsListView.OnScrollListener;
import android.widget.Button;
import android.widget.ExpandableListView;
import android.widget.ImageButton;
import android.widget.ProgressBar;
import android.widget.TextView;

import com.google.gson.Gson;
import com.google.gson.reflect.TypeToken;
import com.studentstreet.adapter.OrderTrackAdapter;
import com.studentstreet.component.AbstractCommonActivity;
import com.studentstreet.component.LoadStateView;
import com.studentstreet.entities.OrderEntity;
import com.studentstreet.tools.HttpHelper;
import com.studentstreet.tools.PreferenceTools;
import com.studentstreet.tools.Util;
import com.studentstreet.tools.dbhelper.OrderDBHelper;

/**
 * @author likebamboo
 * 
 */
public class OrderTrackActivity extends AbstractCommonActivity {
	// Title标题
	private TextView titleText;
	// Login Button登录按钮
	private Button login_bt;
	// 头部左边的按钮
	private ImageButton backImgBt = null;
	// 订单扩展列表控件
	private ExpandableListView exListView = null;
	// 订单列表
	private List<OrderEntity> orderList = null;
	// 适配器
	OrderTrackAdapter adapter = null;
	// 开始进来时的loading
	private LoadStateView loadView = null;
	// 订单列表ListView的页脚部分，可实现分页加载的显示情况
	private View footer;
	// 当前一页订单列表是否加载完
	private boolean loadfinish = true;
	// 当有订单尚未处理时显示此按钮
	private Button goOrderBt = null;
	// 刷新订单列表标记
	private static final int REFRESH_LIST = 0x10001;
	// 订单列表为空
	private static final int EMPTY = 0x10002;
	// 网络错误
	private static final int ERROR = 0x10003;
	// 订单每页显示的数量
	private int pageSize = 5;
	// 当前为第几页（从第0页开始）
	private int page = 0;
	// 是不是将服务器上的数据全部加载完成了
	private boolean isEnd = false;
	// 用户名
	private String userName = "";
	// 订单Json 数据
	private String orderJson = "";
	// 用于数据处理
	OrderDBHelper dbHelper = null;
	// 标记提交到服务器的参数是订单跟踪参数
	private static final String ORDER_TRACK = "order_track";

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		requestWindowFeature(Window.FEATURE_NO_TITLE);
		super.onCreate(savedInstanceState);
		setContentView(R.layout.order_track);
		// 将当前Activity压入堆栈中
		MyApp.getInstance().addActivity(this);
		// sharepreference
		PreferenceTools prefTools = new PreferenceTools(this);
		// 用户名
		userName = prefTools.getUserName();
		// 初始化数据处理操作
		dbHelper = new OrderDBHelper(this);
		// 初始化头部标题
		initHeader();
		// 初始化是有订单尚未处理按钮
		goOrderBt = (Button) findViewById(R.id.track_go_order);
		// 初始化 LoadStateView
		loadView = (LoadStateView) findViewById(R.id.downloadStatusBox);
		loadView.startLoad();
		// 初始化listView
		exListView = (ExpandableListView) findViewById(R.id.list);
		// 初始化底部布局
		footer = getLayoutInflater().inflate(R.layout.footer, null);
		exListView.setOnScrollListener(new ScrollListener());
		exListView.addFooterView(footer);
		// 初始化适配器
		adapter = new OrderTrackAdapter(this);
		exListView.setAdapter(adapter);
		exListView.removeFooterView(footer);
		// 下载订单数据
		loadView.startLoad();
		downOrder();
		// 设置 "重新加载" 监听器
		loadView.setOnReloadClickListener(new View.OnClickListener() {
			@Override
			public void onClick(View v) {
				downOrder();
			}
		});
	}

	// 下载订单数据
	private void downOrder() {
		new Thread(new Runnable() {
			@Override
			public void run() {
				// 使用apache HTTP客户端实现
				String urlStr = Util.BASE_URL + "/servlet/OrderServlet";
				// 创建网络连接工具对象
				HttpHelper helper = new HttpHelper(urlStr);
				// 添加参数
				// 请求标志
				helper.addParam("request", ORDER_TRACK);
				// 用户名
				helper.addParam("userName", userName);
				// 该页起始位置
				helper.addParam("start", page * pageSize + "");
				// 该页大小
				helper.addParam("count", pageSize + "");
				// 获得服务器返回的数据
				orderJson = helper.getResponse();
				// 获得的用户数据为空
				if ("".equals(orderJson)) {
					// 未取得任何数据，显示错误信息
					sendMessage(ERROR);
					return;
				}
				// 将数据填充到adapter中
				fillData(orderJson);
				// 通知listView 有更新
				sendMessage(REFRESH_LIST);
			}
		}).start();
	}

	// 将Json数据填充到
	private void fillData(String jsonString) {
		// 没有符合搜索条件的结果，显示提示信息
		if ("[]".equals(jsonString)) {
			sendMessage(EMPTY);
			return;
		}
		Type listType = new TypeToken<ArrayList<OrderEntity>>() {
		}.getType();
		// 创建Gson 对象
		Gson gson = new Gson();
		// 将Json数据转化为List<Order>
		orderList = gson.fromJson(jsonString, listType);
		// 当服务器上传过来的评论列表数据小于一个页面的大小时，表示已经加载完成了
		if (orderList.size() < pageSize) {
			isEnd = true;
		}
		// 将订单数据添加到适配器
		adapter.addOrderList(orderList);
		// 页数加1
		page++;
	}

	// 初始化头部信息
	private void initHeader() {
		// 返回按钮
		backImgBt = (ImageButton) findViewById(R.id.header_imgBt);
		// 头部中间的标题
		titleText = (TextView) findViewById(R.id.title);
		// 登录按钮
		login_bt = (Button) findViewById(R.id.login_bt);
		// 返回按钮
		backImgBt.setImageResource(R.drawable.back);
		backImgBt.setOnClickListener(new OnClickListener() {
			@Override
			public void onClick(View v) {
				finish();
			}
		});
		// 头部中间的标题
		titleText.setText(getResources().getString(R.string.order_list));
	}

	@Override
	protected void handleOtherMessage(int flag) {
		super.handleOtherMessage(flag);
		switch (flag) {
		case REFRESH_LIST:
			loadfinish = true;
			// 如果存在 页脚 则去掉页脚
			if (exListView.getFooterViewsCount() > 0) {
				exListView.removeFooterView(footer);
			}
			loadView.stopLoad();
			adapter.notifyDataSetChanged();
			break;
		case ERROR:
			loadfinish = true;
			// 如果存在 页脚 则去掉页脚
			if (exListView.getFooterViewsCount() > 0) {
				exListView.removeFooterView(footer);
			}
			loadView.stopLoad();
			loadView.showError();
			break;
		case EMPTY:
			loadfinish = true;
			// 如果存在 页脚 则去掉页脚
			if (exListView.getFooterViewsCount() > 0) {
				exListView.removeFooterView(footer);
			}
			loadView.stopLoad();
			loadView.showEmpty();
			break;

		default:
			break;
		}
	}

	@Override
	protected void onResume() {
		super.onResume();
		// 如果尚有未处理的订单，则让头部按钮显示，点击跳转到订单处理页面
		if (dbHelper.haveNotCommit(userName)) {
			goOrderBt.setVisibility(View.VISIBLE);
			goOrderBt.setOnClickListener(new OnClickListener() {
				@Override
				public void onClick(View v) {
					// 跳转到购物车处理页面
					Intent intent = new Intent(OrderTrackActivity.this,
							CartActivity.class);
					startActivity(intent);
				}
			});
		} else {
			goOrderBt.setVisibility(View.GONE);
		}
		// sharepreference
		PreferenceTools prefTools = new PreferenceTools(this);
		// 判断是否已经登录
		if (!prefTools.isLogin()) {
			return;
		}
		// 登录后修改登录按钮上的text
		userName = prefTools.getUserName();
		if (!userName.equals("")) {
			login_bt.setText(userName);
			// 去掉登录按钮文本右边的图标
			login_bt.setCompoundDrawablesWithIntrinsicBounds(null, null, null,
					null);
		}
	}

	// 处理滑动事件的类
	private final class ScrollListener implements OnScrollListener {
		// 滑动事件
		@Override
		public void onScroll(AbsListView view, int firstVisibleItem,
				int visibleItemCount, int totalItemCount) {
			// 获取当前屏幕最后的Item的Id
			int lastItemid = exListView.getLastVisiblePosition();
			// 达到数据的最后一条记录
			if ((lastItemid + 1) == totalItemCount) {
				if (isEnd) {
					// 如果加载完毕，则显示提示信息
					TextView v = (TextView) footer
							.findViewById(R.id.footer_text);
					// 显示数据加载完毕
					v.setText(getResources().getString(R.string.loadAll));
					ProgressBar bar = (ProgressBar) footer
							.findViewById(R.id.footer_progressBar);
					// progressBar消失
					bar.setVisibility(View.GONE);
					if (exListView.getFooterViewsCount() == 0)
						exListView.addFooterView(footer);
					return;
				}
				if (totalItemCount > 0 && loadfinish) {
					// 进来后 马上改变状态
					loadfinish = false;
					// 添加页脚
					exListView.addFooterView(footer);
					// 从网上加载新一页的评论信息
					downOrder();
				}
			}
		}

		@Override
		public void onScrollStateChanged(AbsListView view, int scrollState) {
		}

	}
}
